//ST表 - 最大数
//解法一: 线段树
// #include <iostream>
// using namespace std;
// #define lc p << 1
// #define rc p << 1 | 1
// const int N = 2e5 + 10;
// int m, d;
// int cnt; //表明当前数列中有多少个数
// typedef long long ll;
// ll last; //上一次查询的结果

// struct node
// {
//     int l, r;
//     ll max;
// }tr[N << 2];

// void pushup(int p)
// {
//     tr[p].max = max(tr[lc].max, tr[rc].max);
// }

// void build(int p, int l, int r)
// {
//     tr[p] = {l, r, 0};
//     if(l == r) return;
//     int mid = (l + r) >> 1;
//     build(lc, l, mid);
//     build(rc, mid + 1, r);
//     pushup(p);
// }

// void modify(int p, int x, ll k)
// {
//     int l = tr[p].l, r = tr[p].r;
//     if(x == l && x == r) 
//     {
//         tr[p].max = k;
//         return;
//     }
//     int mid = (l + r) >> 1;
//     if(x <= mid) modify(lc, x, k);
//     else modify(rc, x, k);
//     pushup(p);
// }

// ll query(int p, int x, int y)
// {
//     int l = tr[p].l, r = tr[p].r;
//     if(x <= l && r <= y) return tr[p].max;
//     int mid = (l + r) >> 1;
//     ll ret = 0;
//     if(x <= mid) ret = max(ret, query(lc, x, y)); 
//     if(y > mid) ret = max(ret, query(rc, x, y));
//     return ret;
// }

// int main()
// {
//     cin >> m >> d;
//     build(1, 1, m);
//     for(int i = 1; i <= m; i++)
//     {
//         char op; ll n; cin >> op >> n;
//         if(op == 'Q')
//         {
//             last = query(1, cnt - n + 1, cnt);
//             cout << last << endl;
//         }
//         else
//         {
//             modify(1, cnt + 1, (n + last) % d);
//             cnt++;
//         }
//     }
//     return 0;
// }


//解法二: 逆序ST表
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
ll m, d, cnt, last; //cnt表示当前数组一共有多少个数, last表示上一次的查询结果
ll f[N][25]; //f[i][j]表示以i位置为结尾的, 长度为2^j的区间的最大值

int main()
{
    cin >> m >> d;
    for(int i = 1; i <= m; i++)
    {
        char op;
        ll n; cin >> op >> n;
        if(op == 'Q') //n表示求末尾多少个数的最大值
        {
            int k = log2(n);
            last = max(f[cnt][k], f[cnt - n + (1 << k)][k]);
            cout << last << endl;
        }
        else
        {
            ll t = (last + n) % d;
            cnt++;
            f[cnt][0] = t;
            for(int j = 1; j <= log2(cnt); j++)
                f[cnt][j] = max(f[cnt][j-1], f[cnt - (1 << (j - 1))][j-1]);
        }
    }
    return 0;
}